//
//  GenericityViewController.swift
//  test_swift
//
//  Created by fangyuan ding on 2021/6/1.
//

import UIKit
struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}
 
extension Stack {
    var topItem: Element? {
       return items.isEmpty ? nil : items[items.count - 1]
    }
}
// Container 协议
protocol Container {
    associatedtype ItemType
    // 添加一个新元素到容器里
    mutating func append(_ item: ItemType)
    // 获取容器中元素的数
    var count: Int { get }
    // 通过索引值类型为 Int 的下标检索到容器中的每一个元素
    subscript(i: Int) -> ItemType { get }
}
class GenericityViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //swift中需要对参数只进行修改,需要用到inout 关键字,调用函数时加&
        // 定义一个交换两个变量的函数
//        func swapTwoInts(_ a: inout Int, _ b: inout Int) {
//            let temporaryA = a
//            a = b
//            b = temporaryA
//        }
//
//        var numb1 = 100
//        var numb2 = 200
//
//        print("交换前数据: \(numb1) 和 \(numb2)")
//        swapTwoInts(&numb1, &numb2)
//        print("交换后数据: \(numb1) 和 \(numb2)")
        
        
//         定义一个交换两个变量的函数
//        func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
//            let temporaryA = a
//            a = b
//            b = temporaryA
//        }
//
//        var numb1 = 100
//        var numb2 = 200
//
//        print("交换前数据:  \(numb1) 和 \(numb2)")
//        swapTwoValues(&numb1, &numb2)
//        print("交换后数据: \(numb1) 和 \(numb2)")
////
//        var str1 = "A"
//        var str2 = "B"
//
//        print("交换前数据:  \(str1) 和 \(str2)")
//        swapTwoValues(&str1, &str2)
//        print("交换后数据: \(str1) 和 \(str2)")
//
//        struct Stack<Element> {
//            var items = [Element]()
//            mutating func push(_ item: Element) {
//                items.append(item)
//            }
//            mutating func pop() -> Element {
//                return items.removeLast()
//            }
//        }
//
//        var stackOfStrings = Stack<String>()
//        print("字符串元素入栈: ")
//        stackOfStrings.push("google")
//        stackOfStrings.push("runoob")
//        print(stackOfStrings.items);
//
//        let deletetos = stackOfStrings.pop()
//        print("出栈元素: " + deletetos)
//
//        var stackOfInts = Stack<Int>()
//        print("整数元素入栈: ")
//        stackOfInts.push(1)
//        stackOfInts.push(2)
//        print(stackOfInts.items);
        
     
         
//        var stackOfStrings = Stack<String>()
//        print("字符串元素入栈: ")
//        stackOfStrings.push("google")
//        stackOfStrings.push("runoob")
//
//        if let topItem = stackOfStrings.topItem {
//            print("栈中的顶部元素是：\(topItem).")
//        }
//
//        print(stackOfStrings.items)
        
        
        // 非泛型函数，查找指定字符串在数组中的索引
        func findIndex(ofString valueToFind: String, in array: [String]) -> Int? {
            for (index, value) in array.enumerated() {
                if value == valueToFind {
                    // 找到返回索引值
                    return index
                }
            }
            return nil
        }
         
         
        let strings = ["google", "weibo", "taobao", "runoob", "facebook"]
        if let foundIndex = findIndex(ofString: "runoob", in: strings) {
            print("runoob 的索引为 \(foundIndex)")
            
          

            // Stack 结构体遵从 Container 协议
            struct Stack<Element>: Container {
                // Stack<Element> 的原始实现部分
                var items = [Element]()
                mutating func push(_ item: Element) {
                    items.append(item)
                }
                mutating func pop() -> Element {
                    return items.removeLast()
                }
                // Container 协议的实现部分
                mutating func append(_ item: Element) {
                    self.push(item)
                }
                var count: Int {
                    return items.count
                }
                subscript(i: Int) -> Element {
                    return items[i]
                }
            }

            var tos = Stack<String>()
            tos.push("google")
            tos.push("runoob")
            tos.push("taobao")
            // 元素列表
            print(tos.items)
            // 元素个数
            print( tos.count)
        }
        
        
        
    }
    

   

}
